#pragma once

#include<sstream>
#include<string>
#include<json/json.h>
#include<memory>


#define TCP_DATA_MAX_LEN 1024                                                                                                                          
#define TCP_PORT 22222

enum chat_msg_type{
    Register = 0,    //注册请求
    Register_Resp,   //注册应答
    Login,          //登录请求
    Login_Resp,     //登录应答
    AddFriend,      //添加好友请求
    AddFriend_Resp, //添加好友应答
    SendMsg,
    SendMsg_Resp,
    PushMsg,
    PushMsg_Resp,
    PushAddFriendMsg,
    PushAddFriendMsg_Resp,
    GetFriendMsg,
    GetFriendMsg_Resp
};

enum reply_status{
    REGISTER_SUCESS = 0,
    REGISTER_FAILED,
    LOGIN_SUCESS,
    LOGIN_FAILED,
    ADDFRIEND_SUCESS,
    ADDFRIEND_FAILED,
    SENDMSG_SUCESS,
    SENDMSG_FAILED,
    GETFRIEND_SUCCESS,
    GETFRIEND_FAILED
};





class ChatMsg{
    public:
		ChatMsg();
		~ChatMsg();

        //提供反序列化的接口，接收完毕请求之后进行反序列化
		int PraseChatMsg(int sockfd, const std::string& msg);
 


        //提供序列化的接口---回复应答的时候使用
        //msg:出参，用于获取序列化完毕的字符串
		bool GetMsg(std::string* msg);

        //获取_json_msg中的value值
		std::string GetValue(const std::string& key);
        //设置_json_msg中的kv键值对
		void SetValue(const std::string& key, const std::string& value);
		void SetValue(const std::string& key, int value);
		void clear();
    public:
        //存放客户端的文件描述符
        int _sockfd;
        //消息类型
        int _msg_type;
        //用户id
        int _user_id;
        //应答的状态（应答是否成功）
        int _reply_status;
        //Json消息,消息的内容会随着消息类型的不同，字段不一样
        Json::Value _json_msg;
};




